import WS from '@/libs/ws.js'
import { reactive } from 'vue'
import axios from 'axios'
import { extractUrls, extractMarkdown } from '../../utils/util'
import { dayjs } from 'element-plus'

import { useScroll } from './utils/scroll'
import MessageQueue from './utils/message-queue'
import { prompts } from './dict'

const useMessage = () => {
  const ws = new WS({
    url: 'ws://10.254.32.20:8765',
    onMessage: value => {
      onMessage(value)
    },
  })

  const send = msg => {
    ws.send('@input: ' + msg)
  }

  function onMessage(item) {
    if (typeof item == 'string') {
      try {
        item = JSON.parse(item)
      } catch (e) {
        item = {
          role: 'system',
          text: item,
        }
      }
    }

    try {
      const { texttype, role, text, id } = item

      // 文档click消息
      if (id && id == state.preview?.docId) {
        state.dialog.preview.show = true
        state.dialog.preview.data = {
          type: state.preview.type,
          content: item.content,
        }

        return messageQueue.next()
      }

      const taskIndex = item.taskindex
      // const taskId = item.taskid ? item.taskid.replace('@taskid:', '') + `-${taskIndex}` : ''
      let taskId

      if (role == 'agent_steps') {
        taskId = item.taskid ? item.taskid.replace('@taskid:', '') + `-${taskIndex}` : ''
        state.taskId = taskId
      }

      // 预览消息
      if (['tool_response', 'tool_output', 'ai_output', 'ai_thought'].includes(role)) {
        taskId = item.taskid ? item.taskid.replace('@taskid:', '') + `-${taskIndex}` : ''

        if (!state.taskMessages[taskId]) state.taskMessages[taskId] = []

        state.taskMessages[taskId].push(item)

        previewScrollRef.value?.openAutoScroll()

        return
      }

      if (text == '@complate_task') {
        state.loading = false
        // messageQueue.next()
        clearInterval(timeClock)
        return
      } else if (text == '@start_task') {
        //  messageQueue.next()
        return
      }

      const result = {
        role: 'system',
        inputType: role,
        // data: item,
        time: dayjs(item.timestamp * 1000).format('HH:mm'),
        taskId,
        rawTaskId: item.taskid.replace('@taskid:', ''),
      }

      //       {
      //   text: '@taskid:8d17a752-1678-405d-85ad-909ed7cfc0dc\n- [x] 查询主机类型分布统计数据\n- [ ] 查询容器状态分布统计数据\n- [ ] 查询应用资产分布统计数据\n- [ ] 查询软件安装包分布统计数据',
      //   role: 'agent_steps',
      //   texttype: 'markdown',
      //   taskid: '@taskid:8d17a752-1678-405d-85ad-909ed7cfc0dc',
      //   taskindex: 1,
      //   timestamp: 1747908702.9422812,
      // },

      if (['doc_id', 'html_id'].includes(item.role)) {
        result.type = { html_id: 'html', doc_id: 'doc' }[item.role]

        try {
          result.content = JSON.parse(item.text.replaceAll(`'`, `"`))
        } catch (e) {
          result.content = [item.text]
          console.warn('doc_id或html_id解析失败', item.text)
        }
      } else if (item.texttype == 'markdown') {
        result.type = 'markdown'
        // result.content = extractMarkdown(item.text)
        result.content = item.text

        // 判断内容是否可以进行折叠
        // const texts = result.content.split('\n')

        //       if (texts.length && texts[0].indexOf('**') != -1) {
        //         result.content = `
        // <details> <summary>${title}</summary>
        // ${texts.join('<br>')}
        // </details>
        //         `
        //       }
      } else if (item.texttype == 'string') {
        result.type = 'txt'
        result.content = item.text
      }

      // 后期优化
      if (role == 'agent_steps') {
        const ary = text
          .split('\n')
          .slice(1)
          .map(val => {
            const item = {}

            if (val.indexOf('[x]') != -1) {
              item.title = val.replace('- [x] ', '')
              item.isSelect = true
            } else {
              item.title = val.replace('- [ ] ', '')
              item.isSelect = false
            }

            return item
          })

        result.type = 'agent_steps'
        result.content = ary
      }

      const addTime = () => {
        if (!chatTimes[result.time]) {
          chatTimes[result.time] = true
          // 丢队列
          // messageQueue.push({
          //   role: 'system',
          //   type: 'time',
          //   content: result.time,
          // })

          // 直接渲染
          state.messages.push({
            role: 'system',
            type: 'time',
            content: result.time,
          })
        }
      }

      if (result.rawTaskId) {
        // 判断任务是否相同
        const index = state.messages.findIndex(item => item.rawTaskId == result.rawTaskId)
        if (index != -1) {
          state.messages[index] = result
        } else {
          addTime()
          state.messages.push(result)
        }
      } else {
        addTime()
        state.messages.push(result) // 直接渲染
        // messageQueue.push(result) // 往队列里面丢
      }

      if (role == 'user_input') {
        state.loading = false // 思考结束
        clearInterval(timeClock)
      }
    } catch (e) {
      console.error(e)
    }
  }

  return {
    ws,
    send,
  }
}

export const useChatStore = () => {
  let timeClock
  const chatTimes = {}
  const scrollContainer = ref(null)
  const previewScrollRef = ref(null) // 预览滚动元素

  // const scroll = useScroll(scrollContainer)

  const ws = new WS({
    url: 'ws://10.254.32.20:8765',
    onMessage: value => {
      onMessage(value)
    },
  })

  const state = reactive({
    showWelcome: true,

    chats: [],
    chatIndex: null,
    chatId: 0,

    messages: [],
    messageId: null,
    messageIndex: 0,

    // 消息队列
    queue: [],

    dialog: {
      input: { show: false },
      preview: { show: false },
    },

    loading: false, // 思考中

    preview: null, // 消息回调

    taskId: null, // 当前任务ID
    tasks: {}, // 任务
    taskMessages: {}, // 任务消息
  })

  const messageQueue = new MessageQueue({
    onRun: item => {
      if (item.inputType == 'agent_steps') {
        state.taskId = item.taskId
      }

      state.messages.push(item)
      if (item.type == 'time') {
        messageQueue.next()
      }

      // scroll.openAutoScroll()
      scrollContainer.value?.openAutoScroll()
    },
  })

  const handleInput = data => {
    state.loading = true

    const message = {
      role: 'user',
      type: 'text',
      content: data,
    }

    if (prompts[data]) message.content = prompts[data]

    state.messages.push(message)

    if (state.showWelcome) state.showWelcome = false

    if (state.chatIndex == null) {
      state.chats.unshift({
        title: message.content || '新会话',
      })
      state.chatIndex = 0
    }

    ws.send('@input: ' + data)
  }

  const handleInputParamter = data => {
    state.messages.push({
      role: 'user',
      type: 'text',
      content: data,
    })

    ws.send('input_paramter: ' + data)
  }

  function onMessage(item) {
    if (typeof item == 'string') {
      try {
        item = JSON.parse(item)
      } catch (e) {
        item = {
          role: 'system',
          text: item,
        }
      }
    }

    try {
      const { texttype, role, text, id } = item

      // 文档click消息
      if (id && id == state.preview?.docId) {
        state.dialog.preview.show = true
        state.dialog.preview.data = {
          type: state.preview.type,
          content: item.content,
        }

        return messageQueue.next()
      }

      const taskIndex = item.taskindex
      // const taskId = item.taskid ? item.taskid.replace('@taskid:', '') + `-${taskIndex}` : ''
      let taskId

      if (role == 'agent_steps') {
        taskId = item.taskid ? item.taskid.replace('@taskid:', '') + `-${taskIndex}` : ''
        state.taskId = taskId
      }

      // 预览消息
      if (['tool_response', 'tool_output', 'ai_output', 'ai_thought'].includes(role)) {
        taskId = item.taskid ? item.taskid.replace('@taskid:', '') + `-${taskIndex}` : ''

        if (!state.taskMessages[taskId]) state.taskMessages[taskId] = []

        state.taskMessages[taskId].push(item)

        previewScrollRef.value?.openAutoScroll()

        return
      }

      if (text == '@complate_task') {
        state.loading = false
        // messageQueue.next()
        clearInterval(timeClock)
        return
      } else if (text == '@start_task') {
        //  messageQueue.next()
        return
      }

      const result = {
        role: 'system',
        inputType: role,
        // data: item,
        time: dayjs(item.timestamp * 1000).format('HH:mm'),
        taskId,
        rawTaskId: item.taskid.replace('@taskid:', ''),
      }

      //       {
      //   text: '@taskid:8d17a752-1678-405d-85ad-909ed7cfc0dc\n- [x] 查询主机类型分布统计数据\n- [ ] 查询容器状态分布统计数据\n- [ ] 查询应用资产分布统计数据\n- [ ] 查询软件安装包分布统计数据',
      //   role: 'agent_steps',
      //   texttype: 'markdown',
      //   taskid: '@taskid:8d17a752-1678-405d-85ad-909ed7cfc0dc',
      //   taskindex: 1,
      //   timestamp: 1747908702.9422812,
      // },

      if (['doc_id', 'html_id'].includes(item.role)) {
        result.type = { html_id: 'html', doc_id: 'doc' }[item.role]

        try {
          result.content = JSON.parse(item.text.replaceAll(`'`, `"`))
        } catch (e) {
          result.content = [item.text]
          console.warn('doc_id或html_id解析失败', item.text)
        }
      } else if (item.texttype == 'markdown') {
        result.type = 'markdown'
        // result.content = extractMarkdown(item.text)
        result.content = item.text

        // 判断内容是否可以进行折叠
        // const texts = result.content.split('\n')

        //       if (texts.length && texts[0].indexOf('**') != -1) {
        //         result.content = `
        // <details> <summary>${title}</summary>
        // ${texts.join('<br>')}
        // </details>
        //         `
        //       }
      } else if (item.texttype == 'string') {
        result.type = 'txt'
        result.content = item.text
      }

      // 后期优化
      if (role == 'agent_steps') {
        const ary = text
          .split('\n')
          .slice(1)
          .map(val => {
            const item = {}

            if (val.indexOf('[x]') != -1) {
              item.title = val.replace('- [x] ', '')
              item.isSelect = true
            } else {
              item.title = val.replace('- [ ] ', '')
              item.isSelect = false
            }

            return item
          })

        result.type = 'agent_steps'
        result.content = ary
      }

      const addTime = () => {
        if (!chatTimes[result.time]) {
          chatTimes[result.time] = true
          // 丢队列
          // messageQueue.push({
          //   role: 'system',
          //   type: 'time',
          //   content: result.time,
          // })

          // 直接渲染
          state.messages.push({
            role: 'system',
            type: 'time',
            content: result.time,
          })
        }
      }

      if (result.rawTaskId) {
        // 判断任务是否相同
        const index = state.messages.findIndex(item => item.rawTaskId == result.rawTaskId)
        if (index != -1) {
          state.messages[index] = result
        } else {
          addTime()
          state.messages.push(result)
        }
      } else {
        addTime()
        state.messages.push(result) // 直接渲染
        // messageQueue.push(result) // 往队列里面丢
      }

      if (role == 'user_input') {
        state.loading = false // 思考结束
        clearInterval(timeClock)
      }
    } catch (e) {
      console.error(e)
    }
  }

  const messages = [
    // // {
    // //   text: '```markdown\n- [ ] 理解输入信息内容与需求\n- [ ] 根据需求获取相关数据\n    - 查询并收集集群中的所有资产信息\n    - 特别注意资产在不同区域或环境中的分布情况\n- [ ] 分析数据形成摘要信息\n    - 按照不同的区域或环境汇总各类资产的数量和类型\n    - 提供关于资产分布的详细概览，包括每个区域或环境中主要资产类别及其数量\n- [ ] 根据摘要信息生成网页\n    - 创建一个包含上述资产分布情况的可视化页面\n    - 确保页面清晰展示各区域或环境中的资产分布，并突出显示任何可能需要特别关注的区域或环境\n```',
    // //   role: 'ai_output',
    // //   texttype: 'markdown',
    // //   parenttask: '',
    // //   timestamp: 1744005137.303204,
    // // },
    // {
    //   text: "已根据'查询集群资产'条件找到可用的API，API可用于：获取集群所有资产数量统计，包括主机节点、命名空间、service、控制器、Ingress、pod、container等资产数量统计",
    //   role: 'tool_output',
    //   texttype: 'string',
    //   parenttask: '',
    //   timestamp: 1744005152.9540088,
    // },
    // // {
    // //   text: '根据API参数要求，必须输入集群名称、用户分页（每页多少条日志）和用户分页（第几页中的数据）三个参数。\n输入示例：集群名称（必填，字符串）：xxx，用户分页（每页多少条日志，必填，数字）：xxx，用户分页（第几页中的数据，必填，数字）：xxx\n。',
    // //   role: 'user_input',
    // //   texttype: 'string',
    // //   parenttask: '',
    // //   timestamp: 1744005162.6998622,
    // // },
    // {
    //   text: '看起来您的输入似乎不是预期的文本格式。能否请您用文字描述您需要查询的内容和具体的需求？例如，您可以询问关于特定系统日志的数据分析或者其他类型的信息查询。这样我可以更好地帮助到您。',
    //   role: 'user_input',
    //   texttype: 'string',
    //   parenttask: '',
    //   timestamp: 1744011651.8189933,
    // },
    // {
    //   text: 'b46db45a-76e5-4503-9310-db366e5edcf7',
    //   role: 'html_id',
    //   texttype: 'string',
    //   parenttask: '',
    //   timestamp: 1744093153.6901393,
    // },
    // {
    //   text: "['6aea37fd-8094-416b-8ad3-4254e6a1161c']",
    //   role: 'doc_id',
    //   texttype: 'string',
    //   parenttask: '',
    //   timestamp: 1744093041.7421198,
    // },
    // {
    //   text: '```markdown\n<details> <summary>查询示例</summary>\n1.获取容器详情<br>2.获取应用详情<br>3.获取已安装软件列表<br>4.获取镜像详情<br>5.获取应用列表<br>6.获取端口详情<br>\n</details>\n```',
    //   role: 'ai_output',
    //   texttype: 'markdown',
    //   parenttask: '',
    //   timestamp: 1744180476.1093905,
    // },
    // {
    //   text: '```markdown\n**查询可以用于查询集群资产的API，然后分析API调用参数并调用API获取响应数据，最后分析API响应数据并存储API影响数据**\n- [ ] 根据需求查找可以用于查询集群资产的API\n- [ ] 分析用于查询集群资产的API是否需要输入相关参数\n- [ ] 调用查询集群资产的API并获取集群资产信息\n- [ ] 分析、理解通过API获取的集群资产信息\n- [ ] 存储分析后的API响应数据\n```',
    //   role: 'agent_steps',
    //   texttype: 'markdown',
    //   parenttask: '',
    //   timestamp: 1744179136.0723143,
    // },
    // {
    //   text: '已获取到运行中容器、已停止容器、特权容器和风险容器的数量，这些信息满足了任务需求中的了解集群中的容器情况的要求。但是原始任务需求是获取整个集群资产分布情况，这一步骤仅完成了其中一部分。',
    //   role: 'ai_output',
    //   texttype: 'string',
    //   parenttask: '',
    //   timestamp: 1744951621.1950428,
    // },
    // {
    //   text: '```json\n {"test":123, "aaa":"sadf"} \n``` \n12312',
    //   role: 'ai_output',
    //   texttype: 'markdown',
    //   parenttask: '',
    //   timestamp: 1745311509.293876,
    // },
    // {
    //   text: '使用`lin:0d7e8f04aefe73d30207e9e35b56391945264e8c1007e14a239bcc05dccbd6a4`参数调用`根据资产ID查询主机入侵攻击情况`API成功，返回API响应数据：```json \n{"items":[]} // 入侵攻击详情列表 \n``` \n使用`lin:27782cc1d588c1846a7d31424cb11109524122e48630b96092f2bccd6bcdf38b`参数调用`根据资产ID查询主机入侵攻击情况`API成功，返回API响应数据：```json \n{ \n  "items":[ \n    { \n      "name":"虚拟补丁防护",//入侵检测名称 \n      "description":"检测到命中虚拟补丁防护规则的漏洞。",//入侵攻击描述 \n      "attack_id":"T1190",//ATT&CK技战术ID \n      "threat_level":"高危",//威胁等级 \n      "hit_count":5279//命中次数 \n    }, \n    { \n      "name":"网络入侵防护",//入侵检测名称 \n      "description":"检测到疑似网络入侵行为",//入侵攻击描述 \n      "attack_id":"T1190",//ATT&CK技战术ID \n      "threat_level":"高危",//威胁等级 \n      "hit_count":166//命中次数 \n    }, \n    { \n      "name":"Linux tmp目录程序运行",//入侵检测名称 \n      "description":"检测到Linux tmp目录程序运行",//入侵攻击描述 \n      "attack_id":"T1059",//ATT&CK技战术ID \n      "threat_level":"低危",//威胁等级 \n      "hit_count":6072//命中次数 \n    }, \n    { \n      "name":"尝试禁用 IPTables 或 防火墙",//入侵检测名称 \n      "description":"尝试禁用 IPTables 或 防火墙",//入侵攻击描述 \n      "attack_id":"T1562.001",//ATT&CK技战术ID \n      "threat_level":"低危",//威胁等级 \n      "hit_count":1//命中次数 \n    } \n  ] \n} \n``` \n使用`lin:92c852c370f2e41cc33c72ebdff259ed0133013242aa5eeccfe9f6256efca00a`参数调用`根据资产ID查询主机入侵攻击情况`API成功，返回API响应数据：```json \n{"items":[]} // 入侵攻击详情列表 \n``` \n使用`lin:b044c8a47f0c88979baa3c74adb46d61634f60e9d967a90a346a6ca6ab5bc486`参数调用`根据资产ID查询主机入侵攻击情况`API成功，返回API响应数据：```json \n{"items":[]} // 入侵攻击详情列表 \n``` \n使用`lin:906d4051d2e7a7626938aa90ca0964e52082d16581ce643574d34eadd8dda535`参数调用`根据资产ID查询主机入侵攻击情况`API成功，返回API响应数据：```json \n{ \n  "items": [ \n    { \n      "name": "发现具有 root 用户 suid 权限程序的提权行为", // 入侵检测名称 \n      "description": "发现具有 root 用户 suid 权限程序的提权行为", // 入侵攻击描述 \n      "attack_id": "T1548", // ATT&CK技战术ID \n      "threat_level": "高危", // 威胁等级 \n      "hit_count": 52679 // 命中次数 \n    }, \n    { \n      "name": "SSH软链接后门", // 入侵检测名称 \n      "description": "设置SSH软链接,该行为会导致该主机可被任意密码登录", // 入侵攻击描述 \n      "attack_id": "T1543", // ATT&CK技战术ID \n      "threat_level": "高危", // 威胁等级 \n      "hit_count": 22 // 命中次数 \n    }, \n    { \n      "name": "删除history文件", // 入侵检测名称 \n      "description": "疑似黑客删除history文件", // 入侵攻击描述 \n      "attack_id": "T1070.003", // ATT&CK技战术ID \n      "threat_level": "高危", // 威胁等级 \n      "hit_count": 20 // 命中次数 \n    }, \n    { \n      "name": "可疑行为", // 入侵检测名称 \n      "description": "检测修改系统关键配置项,并产生告警信息。", // 入侵攻击描述 \n      "attack_id": "T1203", // ATT&CK技战术ID \n      "threat_level": "中危", // 威胁等级 \n      "hit_count": 2061 // 命中次数 \n    }, \n    { \n      "name": "检测到潜在的贯穿运行控制的持久性", // 入侵检测名称 \n      "description": "检测到潜在的贯穿运行控制的持久性", // 入侵攻击描述 \n      "attack_id": "T1037.004", // ATT&CK技战术ID \n      "threat_level": "中危", // 威胁等级 \n      "hit_count": 532 // 命中次数 \n    } \n  ] \n} \n```',
    //   role: 'ai_output',
    //   texttype: 'markdown',
    //   parenttask: '',
    //   timestamp: 1745916477.2808034,
    // },
    // {
    //   text: '@taskid:0f3562e7-dec2-4e32-8342-abcecf01be68\n- [ ] 查询告警数量最多的TOP5主机信息\n- [ ] 查询最近触发告警的TOP5主机信息\n- [ ] 查询近期发生告警的TOP5主机告警统计信息\n- [ ] 查询基线告警数量最多的TOP5主机信息',
    //   role: 'agent_steps',
    //   texttype: 'markdown',
    //   taskid: '0f3562e7-dec2-4e32-8342-abcecf01be68',
    //   taskindex: 0,
    //   timestamp: 1747901637.3388624,
    // },
    // {
    //   text: '查询告警数量最多的TOP5主机信息',
    //   role: 'tool_output',
    //   texttype: 'markdown',
    //   taskid: '@taskid:0f3562e7-dec2-4e32-8342-abcecf01be68',
    //   taskindex: 0,
    //   timestamp: 1747901642.4932344,
    // },
    // {
    //   text: '根据历史信息和当前的任务响应结果，所有尝试通过API调用或从记忆中提取数据的任务均因连接被拒绝的错误未能成功获取到告警数量最多的TOP5主机信息。因此，任务要求尚未满足。',
    //   role: 'ai_thought',
    //   texttype: 'markdown',
    //   taskid: '@taskid:0f3562e7-dec2-4e32-8342-abcecf01be68',
    //   taskindex: 1,
    //   timestamp: 1747901938.2861137,
    // },
    // {
    //   text: '任务 使用SearchMemory工具，填入{"question":"查询告警数量最多的TOP5主机信息", "memory":""}参数，完成从历史信息中提取相关数据的任务。 ，达到最大尝试次数，强制结束当前任务。',
    //   role: 'ai_output',
    //   texttype: 'string',
    //   taskid: '',
    //   taskindex: 0,
    //   timestamp: 1747901938.2865274,
    // },
    // {
    //   text: '@taskid:8d17a752-1678-405d-85ad-909ed7cfc0dc\n- [ ] 查询主机类型分布统计数据\n- [ ] 查询容器状态分布统计数据\n- [ ] 查询应用资产分布统计数据\n- [ ] 查询软件安装包分布统计数据',
    //   role: 'agent_steps',
    //   texttype: 'markdown',
    //   taskid: '8d17a752-1678-405d-85ad-909ed7cfc0dc',
    //   taskindex: 1,
    //   timestamp: 1747908635.2515786,
    // },
    // {
    //   text: '@taskid:8d17a752-1678-405d-85ad-909ed7cfc0dc\n- [x] 查询主机类型分布统计数据\n- [ ] 查询容器状态分布统计数据\n- [ ] 查询应用资产分布统计数据\n- [ ] 查询软件安装包分布统计数据',
    //   role: 'agent_steps',
    //   texttype: 'markdown',
    //   taskid: '@taskid:8d17a752-1678-405d-85ad-909ed7cfc0dc',
    //   taskindex: 1,
    //   timestamp: 1747908702.9422812,
    // },
  ]

  for (let i = 0; i < messages.length; i++) {
    onMessage(messages[i])
    // messageQueue.push(messages[i])
  }

  return {
    state,
    scrollContainer,
    previewScrollRef,

    messageQueue,
    ws,

    handleInput,
    handleInputParamter,
  }
}

// function scrollToBottom() {
//   if (scrollContainer.value) {
//     scrollContainer.value.scrollTo({
//       top: scrollContainer.value.scrollHeight + 200,
//       behavior: 'smooth',
//     })
//   }
// }

// axios({
//   url: 'http://127.0.0.1:1200/api/message',
// }).then(res => {
//   res.data.data.forEach((item, index) => {
//     setTimeout(() => {
//       onMessage(item)
//     }, index * 1)
//   })
// })
